// 如果实现的方法不使用size记录长度，那么就不能使用 this.size === this.space 去判断队满的情况，所以关键问题是如何去判断队满的情况
// 采用的方案是，废弃掉一个空间，用来记录判断队满的情况
// 队空的判断   this.head === this.tail
// 同样使用数组实现这个循环列表

class NoSizeCycleQueue {
  _arr = [];
  _head = 0;
  _tail = 0;
  _space = 0;

  constructor(space) {
    if (!space || space <= 0) {
      throw new Error("space must be > 0");
    }
    this._space = space;
    this._arr = new Array(this._space);
  }

  // 入队
  push(item) {
    // 判断队满的情况
    var temp = (this._tail + 1) % this._space;
    if (temp === this._head) {
      console.log(
        "🚀 ~ This is a result of console.log ~ ✨: 队满，无法再添加数据",
        item
      );
      return false;
    }
    this._arr[this._tail] = item;
    this._tail = temp;
    return true;
  }

  // 出队
  pop() {
    if (this._head === this._tail) {
      console.log("队列为空");
      return;
    }
    var item = this._arr[this._head];
    this._arr[this._head] = null;
    this._head = (this._head + 1) % this._space;
    return item;
  }

  print() {
    console.log("队列成员：" + this._arr);
    console.log("队列空间：" + this._space);
    console.log("队头指针：" + this._head, "队尾指针：" + this._tail);
  }
}

// 没有记录长度，牺牲了一个空间来存为tail,其实只存了一个数据
const nosizecyclequeue = new NoSizeCycleQueue(2);

nosizecyclequeue.push(1);
// nosizecyclequeue.push(2);
nosizecyclequeue.print();

nosizecyclequeue.push(3);
